#ifndef _INC_UNIVERSITY_T_H
#define _INC_UNIVERSITY_T_H

#include <string>
#include <map>

class Faculty_t;

class University_t
{
public:
	/**
	* Dtor
	*/
	virtual ~University_t();

	/**
	* Returns the singleton instance of this class
	*/
	static University_t& instance();

	/**
	* Attempts to add given faculty (unique name) to the university
	* Returns true if successful, false otherwise
	*/
	bool addFaculty(Faculty_t* const faculty);

	/**
	* Attempts to find faculty according to given name
	* Returns faculty if successful, NULL otherwise
	*/
	Faculty_t* findFaculty(const std::string& name) const;

	/**
	* Notifies on price raised
	*/
	void notifyPriceRaised() const;

	/**
	* Notifies on lecture canceled
	*/
	void notifyLectureCanceled() const;

private:
	/**
	* Ctor
	*/
	University_t();

	/**
	* Copy Ctor - no impl
	*/
	University_t(const University_t& other);

	/**
	* Operator= - no impl
	*/
	University_t& operator=(const University_t& other);

	static University_t m_instance;

	typedef std::map<std::string, Faculty_t*> FacultyContainer;
	FacultyContainer m_faculties;
};

#endif // _INC_UNIVERSITY_T_H